package com.cskaoyan.javase.string.notvar2.exercise;

/**
 * @description: 练习4
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

/**
 * s1+s2拼接的结果，内容上实际上就是s3
 * 但是s3是字符串常量池中的对象
 * (s1+s2)呢？
 * 思考：(s1+s2)这个对象会在字符串常量池吗？
 * 只有字面值常量的字符串才能够在编译时期加入字符串常量池
 * 因为它在程序的运行期间 它的取值是不变的
 * (s1+s2)它的取值在整个程序运行期间 也一定是不变的吗？也一定是常量吗？
 * 两个变量相加 拼接字符串 一定得到的也是变量
 * 所以（s1+s2）一定是在堆上从新开辟了空间，创建了对象，一定不在字符串常量池中
 *
 * 使用加号对字符串进行拼接操作时：
 *
 * - 当参与字符串拼接的两个字符串中，至少有一个是以引用变量的形式出现时
 *  - 必然会在堆上创建新的字符串对象
 *    - 原因是变量参与了运算，无法在编译时期确定其值，就不能在编译时期加入常量池
 * - 只有参与字符串拼接运算的两个字符串，都是字符串字面值常量的时候
 *  - 此时不会在堆上创建新的字符串对象，而是在常量池中直接拼接创建对象
 *  - 如果已存在，则不创建新的对象
 *
 */
public class Demo4 {
    public static void main(String[] args) {
        int a = 3; //3是常量 a肯定是变量
        String s1 = "hello"; //s1是一个引用，它是变量
        String s2 = "world";
        String s3 = "helloworld";
        System.out.println(s3==(s1+s2)); //false
        System.out.println(s3.equals(s1+s2)); //true
        System.out.println(s3 == ("hello"+s2)); //false

        System.out.println(s3==("hello"+"world"));  //true 直接共享字符串常量池中的对象
        System.out.println(s3.equals("hello"+"world")); //true

    }
}
